'''编写一个程序，生成一个10×10的随机矩阵并保存为文件（空格分隔行向量、换行分隔列向量），再
写程序将刚才保存的文件另存为CSV格式，用Excel或文本编辑器打开看看结果对不对。'''
import random    #导入随机数包
def makeEle(elen:'int'=0):      #定义一个生成矩阵元素element的函数makeEle()
    element = str(round(random.uniform(0,10**elen),2))    #矩阵元素转为str以便于用jion()写入
    return element
    
def makeMat(ylen:'int',xlen:'int',elen:'int'):    #定义一个生成矩阵的函数makeMat()
#参数xlen、ylen分别表示矩阵的行长度和列长度
    mat = []    #声明二维列表mat用来表示整个矩阵
    for line in range(xlen):    #“行长度”其实是列数，反之“列长度”其实是行数，所以用
        thisLine = []   #声明列表thisLine用来表示矩阵的第line+1行
        for element in range(ylen) :    #对第line行的第element+1个元素
            thisLine.append(makeEle(elen))    #该元素为makeEle()造出来的元素，并加入thisLine中
            #注意此处对列表thisLine第element+1个元素thisline[element]赋值要采用appende方法，不能采用‘=’赋值，
            #因为thisLine一开始是一个空列表，你要赋值的thisline[element]其实并不存在，无法赋值上去
        mat.append(thisLine)    #thisLine收集够元素之后，mata再把thisLine装进去
        #注意mat的append()语句要写在‘for line’语句内，否则无法及时装载每一个thisLine
    return mat

def writeMat(mat:'list'):    #定义一个生成10×10随机矩阵文件'mat.txt'（空格分隔符）的函数
    f = open('mat.txt','w',encoding = 'utf-8')    #注意'w'参数必不可少，否则无法创建新文件
    for row in mat:
        f.write(' '.join(row)+'\n')    #用jion和连字符落实“空格词、换行分行”的要求
    f.close()

def transFile():    #定义一个将'mat.txt'转化为CSV（逗号分隔符）的函数
    f = open('mat.txt','r',encoding = 'utf-8')    #参数写'r'即可，因为不需要修改'mat.txt'
    newMat = []    #声明列表newMat用于获取'mat.txt'内的数据，不能作弊沿用刚才写'mat.txt'用的列表mat
    for line in f:
        newMat.append(line.strip('\n').split(' '))    #获取每一行的数据
    f.close()
    f = open('mat.csv','w',encoding = 'utf-8')    #创建一个'mat.csv'文件
    for row in newMat:
        f.write(','.join(row)+'\n')    #数据之间jion()进逗号，行末补上换行符，满足csv文件的格式
    f.close()

def main():
    mat = makeMat(10,10,4)
    print('矩阵构造完毕！')    #用来提示工作进度
    writeMat(mat)
    print('矩阵写入完毕！')
    transFile()
    print('CSV文件创建完毕！')

main()



